/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package vue.composants;

import modele.*;

import java.awt.*;
import java.awt.Image;
import java.awt.font.TextAttribute;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.Map;
import main.Outils;
import vue.EcranImpression;
import vue.EcranTexte;
/**
 *
 * @author romain
 */
public class EcranImpressionCPD extends CartePostaleDrawer {

    // Référence vers l'écran
    private EcranImpression ecran;

    // Image de fond en cache
    private modele.Image imageDeFond;

    public EcranImpressionCPD(Ressources ressources, vue.EcranImpression ecran, CartePostale cartePostale, String etapeCreation, Dimension dimension) {

        super(ressources, cartePostale, etapeCreation, dimension);
        // On garde le lien
        this.ecran = ecran;

        // On travaille l'image de fond une fois pour toute
        imageDeFond = null;
        modele.Image imageDeFondRessource = ressources.getCartePostale().getImageDeFond();
        if( imageDeFondRessource != null ) {

            // Si besoin on restaure le fond
            if( imageDeFondRessource.estEnregistreeEnMemoire() )
                imageDeFondRessource.chargerDepuisMemoire();

            // On travaille l'image pour pouvoir l'appliquer au fond
            imageDeFond = new modele.Image(null,null,null,null);
            imageDeFond.setImage(
                    Outils.ajuster(
                        imageDeFondRessource.getImage(),
                        dimension
                    )
                );

            // On libère la mémoire
            imageDeFondRessource.enregistrerEnMemoire();
        }
    }


    public BufferedImage getImageFinale(){
       BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
       Graphics2D g = image.createGraphics();
       this.paintAll(g);
       g.dispose();
       return image;
    }


    @Override
    public void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D)g;
        int i, x, y, w, h;


        // ------------------------------
        // Dessin du fond
        // ------------------------------

        // On regarde s'il y a une image ou une couleur de fond
        if( imageDeFond != null ) {
            g.drawImage(imageDeFond.getImage(), 0, 0, null);
        } else {
            g.setColor( cartePostale.getCouleurDeFond() );
            g.fillRect(0, 0, width, height);
        }

        // Dessin d'une bordure
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width, height);


        // ------------------------------
        // Dessin des zones d'image
        // ------------------------------

        // On récupère les images avec leur zones respectives
        ImageSurZone imgSurZone[] = cartePostale.getImagesSurZones();

        // On boucle pour chaque zone
        for(i=0; i < imgSurZone.length; i++) {

            ZoneImage zi = imgSurZone[i].getZone();
            modele.Image im = imgSurZone[i].getImage();

            // On redimensionne les coordonnées à l'échelle

            x = redim(zi.getPosX());
            y = redim(zi.getPosY());
            w = redim(zi.getWidth());
            h = redim(zi.getHeight());

            /* T0D0 : prise en compte des rotations */

            /* Il y a une image sur la zone */

            // On la redimensionne
//            BufferedImage mini = Outils.homothetie(imageSurLaZone.getImage().getImageOuMiniature(), facteur);
            BufferedImage mini = Outils.ajuster(im.getImageOuMiniature(), new Dimension(w,h) );

            // On la dessine
            g.drawImage(mini, x, y, null);

        }


        // ------------------------------
        // Dessin du texte
        // ------------------------------

        // On récupère la zone de texte à afficher

        ZoneTexte zoneTexte = cartePostale.getModele().getZoneTexte();

        TextePerso textePerso = cartePostale.getTextePerso();

        // On récupère le texte
        String texte = textePerso.getTexte();

        // On récupère la police
        Font font = textePerso.getPolice();

        // On récupère  la taille de la font du modèle
        int tailleFont = cartePostale.getModele().getZoneTexte().getTailleFont();

        // On doit agrandir la font car la taille est à 1 pour les fichiers chargés
        double tailleEchelle = (double)tailleFont * facteur;
        font = font.deriveFont( new Float(tailleEchelle) );

        // On récupère la couleur
        Color couleur = textePerso.getCouleur();

        // On récupère la mise en forme
        boolean estGras = textePerso.getEstGras();
        boolean estItalique = textePerso.getEstItalique();
        boolean estSouligne = textePerso.getEstSouligne();

        // On redimensionne la coordonnée à l'échelle
        x = redim(zoneTexte.getPosX());
        y = redim(zoneTexte.getPosY());

        // On détermine la taille du texte pour pouvoir centrer
        FontMetrics metrics = new FontMetrics(font) {};
        Rectangle2D bounds = metrics.getStringBounds(texte, null);
        int widthInPixels = (int)bounds.getWidth();
        int heightInPixels = (int)bounds.getHeight();

        Map map = font.getAttributes();
        if( estGras )
            map.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
        if( estItalique )
            map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
        if( estSouligne )
            map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);

        // On modifie la font
        font = font.deriveFont(map);

        // Dernier réglages
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setFont(font);

        // Effet de surbrillance pour faciliter la lecture
        if( couleur != Color.WHITE )
            g2d.setColor(Color.WHITE);
        else
            g2d.setColor( Color.BLACK );
        g2d.drawString(texte, x-(widthInPixels/2)+1, y-(heightInPixels/2)+1);

        // On dessine le texte par dessus
        g2d.setColor(couleur);
        g2d.drawString(texte, x-(widthInPixels/2), y-(heightInPixels/2));
    }

}
